import axios from 'axios'
import { ElMessage } from 'element-plus'
// 导入模拟数据
import * as mockData from './mock'

// 创建axios实例
const service = axios.create({
  // API基础URL
  baseURL: '/api',
  // 请求超时时间
  timeout: 10000,
  // 设置Content-Type
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 是否使用模拟数据（开发环境使用）
const USE_MOCK = process.env.NODE_ENV === 'development' || true

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    // 如果token存在，添加到请求头
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    
    // 根据后端返回的code判断请求是否成功
    if (res.code !== 200) {
      ElMessage.error(res.message || '请求失败')
      return Promise.reject(new Error(res.message || '请求失败'))
    } else {
      return res
    }
  },
  // 处理模拟数据和错误的函数
  error => {
    if (USE_MOCK) {
      const url = error.config?.url
      const method = error.config?.method
      
      // 模拟登录
      if (url?.includes('/user/login') && method === 'post') {
        return mockData.mockLoginResponse
      }
      // 模拟注册
      else if (url?.includes('/user/register') && method === 'post') {
        return mockData.mockRegisterResponse
      }
      // 模拟获取商品列表
      else if (url?.includes('/products') && method === 'get' && !url?.includes('/products/')) {
        return mockData.mockProductListResponse
      }
      // 模拟获取订单列表
      else if (url?.includes('/orders') && method === 'get' && !url?.includes('/orders/')) {
        return mockData.mockOrderListResponse
      }
      // 模拟获取统计数据
      else if (url?.includes('/admin/stats') && method === 'get') {
        return mockData.mockStatsResponse
      }
      // 模拟获取用户信息
      else if (url?.includes('/user/info') && method === 'get') {
        return {
          code: 200,
          message: '获取成功',
          data: mockData.mockUsers[0]
        }
      }
      // 模拟获取商品分类
      else if (url?.includes('/products/categories') && method === 'get') {
        return {
          code: 200,
          message: '获取成功',
          data: mockData.mockCategories
        }
      }
    }
    
    // 处理网络错误等
    let message = ''
    if (error.response) {
      // 服务器返回错误状态码
      switch (error.response.status) {
        case 401:
          message = '未授权，请重新登录'
          // 清除token并跳转到登录页
          localStorage.removeItem('token')
          localStorage.removeItem('userInfo')
          location.href = '/login'
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求错误，未找到该资源'
          break
        case 408:
          message = '请求超时'
          break
        case 500:
          message = '服务器内部错误'
          break
        case 501:
          message = '服务器未实现该请求'
          break
        case 502:
          message = '网络错误'
          break
        case 503:
          message = '服务器繁忙'
          break
        case 504:
          message = '网络超时'
          break
        default:
          message = `连接错误(${error.response.status})!`
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      message = '网络连接失败，请检查您的网络设置'
    } else {
      // 请求配置出错
      message = error.message || '请求失败'
    }
    
    ElMessage.error(message)
    return Promise.reject(error)
  }
)

// 导出封装的请求方法
export default service

// 导出各模块API
export * from './user'
export * from './product'
export * from './order'
export * from './admin'
